import openai
import os
import openai
from dotenv import load_dotenv, find_dotenv
from openai import OpenAI
def get_openai_key():
    _ = load_dotenv(find_dotenv())
    return os.environ['OPENAI_API_KEY']


client = OpenAI(
    api_key=get_openai_key(),  # This is the default and can be omitted
    base_url="https://api.proxyxai.com/v1"
)


def get_completion_from_messages(messages, model="gpt-4o", temperature=0):
    response = client.chat.completions.create(
            model=model,
            messages=messages,
            temperature=temperature, # 控制模型输出的随机程度
            )
        # print(str(response.choices[0].message))
    return response.choices[0].message.content


import panel as pn
pn.extension()


panels = []
context = [{'role':'system', 'content':"""
你是订餐机器人，为披萨餐厅自动收集订单信息。
你要首先问候顾客。然后等待用户回复收集订单信息。收集完信息需确认顾客是否还需要添加其他内容。
最后需要询问是否自取或外送，如果是外送，你要询问地址。
最后告诉顾客订单总金额，并送上祝福。
请确保明确所有选项、附加项和尺寸，以便从菜单中识别出该项唯一的内容。
你的回应应该以简短、非常随意和友好的风格呈现。
菜单包括：
菜品：
意式辣香肠披萨（大、中、小） 12.95、10.00、7.00
运行如上代码可以得到一个点餐机器人，下图展示了一个点餐的完整流程：
芝士披萨（大、中、小） 10.95、9.25、6.50
茄子披萨（大、中、小） 11.95、9.75、6.75
薯条（大、小） 4.50、3.50
希腊沙拉 7.25
配料：
奶酪 2.00
蘑菇 1.50
香肠 3.00
加拿大熏肉 3.50
AI酱 1.50
辣椒 1.00
饮料：
可乐（大、中、小） 3.00、2.00、1.00
雪碧（大、中、小） 3.00、2.00、1.00
瓶装水 5.00
"""} ] #
inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
def collect_messages(_):
    prompt = inp.value_input
    inp.value = ''
    context.append({'role': 'user', 'content': f"{prompt}"})
    response = get_completion_from_messages(context)
    context.append({'role': 'assistant', 'content': f"{response}"})

    # 添加用户消息
    panels.append(
        pn.Row('User:', pn.pane.Markdown(prompt, width=600))
    )

    # 添加助手消息，并使用 HTML 标签设置背景颜色
    response_with_style = f'<div style="background-color: #F6F6F6; padding: 10px; width: 600px;">{response}</div>'
    panels.append(
        pn.Row('Assistant:', pn.pane.HTML(response_with_style))
    )

    return pn.Column(*panels)





button_conversation = pn.widgets.Button(name="Chat!")
interactive_conversation = pn.bind(collect_messages, button_conversation)
dashboard = pn.Column(
    inp,
    pn.Row(button_conversation),
    pn.panel(interactive_conversation, loading_indicator=True, height=300),
)
dashboard.servable()


# 在命令行中运行：conda activate your_env
# 进入项目根目录：
# 运行脚本：panel serve .\chapter8\example5.py --autoreload
# 打开浏览器：http://localhost:5006/example5
# 然后就可以开始你的订餐之旅了！